import {threejs} from './m/threejs.ts';
import {layout} from './m/layout.ts';
import {echarts} from './m/echarts.ts';
import {form} from './m/form.ts';
import {advanced} from './m/advanced.ts';
import {utils} from './m/utils.ts';
import {vue} from './m/vue.ts';

/**
 * 开发规范：
 * 1. key 不能出现大写字母，要满足浏览器地址规范。
 * 2. 对象结构和 views 中的目录结构要保持一致
 */
const dictionary: I18nNode = {
    vue,
    threejs,
    layout,
    echarts,
    utils,
    ai: {
        zhCN: 'AI',
        en: 'AI',
        typing_effect: {
            zhCN: 'Typing Effect 打字效果',
            en: 'Typing Effect',
        },
    },
    geometry: {
        zhCN: 'Geometry 几何',
        en: 'Geometry',
        css_3d: {
            zhCN: 'CSS 3D',
            en: 'CSS 3D',
        },
    },
    feedback: {
        zhCN: 'Feedback 反馈组件',
        en: 'Feedback',
        message: {
            zhCN: 'Message 消息提示',
            en: 'Message',
        },
        message_box: {
            zhCN: 'Message Box 消息弹出框',
            en: 'Message Box',
        },
        dialog: {
            zhCN: 'Dialog 对话框',
            en: 'Dialog',
        },
    },
    data: {
        zhCN: 'Data 数据',
        en: 'Data',
        collapse: {
            zhCN: 'Collapse 媒体查看器',
            en: 'Collapse',
        },
        rolling_pagination: {
            zhCN: 'Rolling Pagination 滚动分页',
            en: 'Rolling Pagination',
        },
        image: {
            zhCN: 'Image 图片',
            en: 'Image',
        },
        skeleton: {
            zhCN: 'Skeleton 骨架',
            en: 'Skeleton',
        },
        table: {
            zhCN: 'Table 表格',
            en: 'Table',
        },
        media_viewer: {
            zhCN: 'Media Viewer 媒体查看器',
            en: 'Media Viewer',
        },
    },
    navigation: {
        zhCN: 'Navigation 导航',
        en: 'Navigation',
        dropdown: {
            zhCN: 'Dropdown 下拉菜单',
            en: 'Dropdown',
        },
        new_tab_page: {
            zhCN: 'New Tab Page 新标签页',
            en: 'New Tab Page',
        },
        tabs: {
            zhCN: 'Tabs 标签页',
            en: 'Tabs',
        },
    },
    canvas: {
        zhCN: 'Canvas 画布',
        en: 'Canvas',
        base: {
            zhCN: 'Base 基础',
            en: 'Base',
        },
        burrow: {
            zhCN: 'Burrow 挖洞',
            en: 'Burrow',
        },
    },
    form,
    basic: {
        zhCN: 'Basic 基础组件',
        en: 'Basic',
        button: {
            zhCN: 'Button 按钮',
            en: 'Button',
        },
        underline: {
            zhCN: 'Underline 下划线',
            en: 'Underline',
        },
    },
    optimize: {
        zhCN: '优化',
        en: 'Optimize',
    },
    advanced,
    network: {
        zhCN: 'Network 网络',
        en: 'Network',
        websocket: {
            zhCN: 'WebSocket',
            en: 'WebSocket',
        },
        sse: {
            zhCN: 'SSE',
            en: 'SSE',
        },
    },
    git: {
        zhCN: 'Git',
        en: 'Git',
        sample_set: {
            zhCN: '示例集',
            en: 'Sample Set',
        },
    },
};

/**
 * 把嵌套的 i18n 对象扁平化到 messages
 */
// ============== 类型定义 ==============
type LocaleKey = 'zhCN' | 'en';

// 描述任意节点：要么同时有 zhCN / en，要么还能继续往下嵌套
type I18nNode = {
    [K in LocaleKey]?: string;
} & {
    [subKey: string]: I18nNode | string | undefined;
};

// 最终扁平化的 messages
type Messages = Record<LocaleKey, Record<string, string>>;

// ============== 实现 ==============
const messages: Messages = {zhCN: {}, en: {}};

function convertI18nToMessages(
    src: I18nNode,
    dst: Messages,
    prefix = '',
): void {
    for (const k in src) {
        if (!Object.prototype.hasOwnProperty.call(src, k)) continue;

        const v = src[k];
        const path = prefix ? `${prefix}.${k}` : k;

        // 只有对象才继续处理
        if (v && typeof v === 'object') {
            // 写入当前节点的文案
            if (typeof v.zhCN === 'string') dst.zhCN[path] = v.zhCN;
            if (typeof v.en === 'string') dst.en[path] = v.en;

            // 递归其它 key
            for (const sub in v) {
                if (sub !== 'zhCN' && sub !== 'en') {
                    convertI18nToMessages(v as I18nNode, dst, path);
                    break; // 只要出现子节点就一次性递归整个节点
                }
            }
        }
    }
}

convertI18nToMessages(dictionary, messages);
// console.log(JSON.stringify(messages, null, 2));
import {createI18n} from 'vue-i18n';

const i18nConfig = {
    globalInjection: true,
    fallbackLocale: 'zhCN', // 默认语言
    locale: 'zhCN',
    legacy: false, // you must set `false`, to use Composition API
    messages,
};

export const i18n = createI18n(i18nConfig);
// 导出类型增强
export type I18nType = typeof i18n;
